import config from '@/config';
import storage from '@/utils/storage';
import constant from '@/utils/constant';
import { login, logout, getInfo } from '@/api/login';
import {
	getToken,
	setToken,
	removeToken,
	getChangeToken,
	setChangeToken,
	removeChangeToken,
} from '@/utils/auth';

const baseUrl = config.baseUrl;

const user = {
	state: {
		token: getToken(),
		name: storage.get(constant.name),
		avatar: storage.get(constant.avatar),
		roles: storage.get(constant.roles),
		permissions: storage.get(constant.permissions),
		userInfo: {},
	},

	mutations: {
		SET_TOKEN: (state, token) => {
			state.token = token;
		},
		SET_USERINFO: (state, userInfo) => {
			uni.setStorage({
				key: 'userinfo',
				data: userInfo,
			});
			state.userInfo = userInfo;
		},
		SET_NAME: (state, name) => {
			state.name = name;
			storage.set(constant.name, name);
		},
		SET_AVATAR: (state, avatar) => {
			state.avatar = avatar;
			storage.set(constant.avatar, avatar);
		},
		SET_ROLES: (state, roles) => {
			state.roles = roles;
			storage.set(constant.roles, roles);
		},
		SET_PERMISSIONS: (state, permissions) => {
			state.permissions = permissions;
			storage.set(constant.permissions, permissions);
		},
	},

	actions: {
		// 登录
		Login({ commit }, userInfo) {
			const username = userInfo.username.trim();
			const password = userInfo.password;
			const code = userInfo.code;
			const uuid = userInfo.uuid;
			return new Promise((resolve, reject) => {
				login(username, password, code, uuid)
					.then(res => {
						if (res.data.needToModify == true) {
							setChangeToken(res.data.token);
							setToken(res.data.token);
						} else {
							setToken(res.data.token);
							removeChangeToken();
						}
						commit('SET_TOKEN', res.data.token);
						resolve();
					})
					.catch(error => {
						reject(error);
					});
			});
		},

		// 获取用户信息
		GetInfo({ commit, state }) {
			return new Promise((resolve, reject) => {
				getInfo()
					.then(res => {
						const user = res.data.user;
						const avatar =
							user == null || user.avatar == '' || user.avatar == null
								? require('@/static/images/no_qx.png')
								: baseUrl + user.avatar;
						const username =
							user == null || user.userName == '' || user.userName == null
								? ''
								: user.userName;
						if (res.data.roles && res.data.roles.length > 0) {
							commit('SET_ROLES', res.data.roles);
							commit('SET_PERMISSIONS', res.data.permissions);
						} else {
							commit('SET_ROLES', ['ROLE_DEFAULT']);
						}
						commit('SET_USERINFO', user);
						commit('SET_NAME', user.nickName);
						commit('SET_AVATAR', avatar);

						resolve(res.data);
					})
					.catch(error => {
						reject(error);
					});
			});
		},

		// 退出系统
		LogOut({ commit, state }) {
			return new Promise((resolve, reject) => {
				logout(state.token)
					.then(() => {
						commit('SET_TOKEN', '');
						commit('SET_ROLES', []);
						commit('SET_PERMISSIONS', []);
						removeToken();
						removeChangeToken();
						storage.clean();
						resolve();
					})
					.catch(error => {
						reject(error);
					});
			});
		},
		updateUserinfo({ commit }, data) {
			commit('SET_USERINFO', data);
		},
	},
};

export default user;
